リモート開発 シークレット どうする
概ねリモートホストで開発するという行為そのものをやめたほうがいいらしいです
ローカルで開発する場合でもセキュアストレージに頼らずにクレデンシャルを扱うにはどうしたらいいかという方向性自体は有用なのだが……
基本戦略
短命(<12h)なトークンを取得してキャッシュする
可能ならメモリ上,短命なのでファイルに置くのでも可
ホスト環境のブラウザは使えない(セッションが無い)のでゲストのブラウザを使いたい
ホストでサーバーを立てる OAuth2 の auth code flow は使えない Device Flow を使いたいところ
署名
SSH Agent や GPG Agent を持っていけるならそれを使えばいい
それが無い場合は……
落とし穴
secretservice requires graphical sessions...
復号がグラフィックセッションと紐付いているため
解決策
GCM_CREDENTIAL_STORE=cache
GCM_CREDENTIAL_CACHE_OPTIONSでオプションも指定できる
file store とかもあるが,GitHub の吐き出すトークンの有効期限が長すぎるので使うべきではない メモリに保持して確実に破棄してくれる cache store を使おう
ゲストマシンで GUI が開く
GUI のあるゲストマシンでやっている場合こちらからは操作できない GUI プロンプトが開いたりブラウザを開かれたりして破滅する
GCM_GUI_PROMPT=0で GUI プロンプトを開かせないように
Device Flow を使わせる
GCM_GITHUB_AUTHMODES=device
残念ながら GitHub しかサポートしてないので他のやつらは諦めるほかない gcloud auth login --no-browserで動く
他の端末でログイン動作を実行してその auth code + α を受け取らせ,それをコピペで貼り付けて人間にプロキシさせるという,OOB authcode を形だけ回避したみたいなすごい実装になっている
あんまり短命ではない
aws sso login
たすけてー(泣)
op コマンドは存在するならホストの 1password アプリに接続しようとする
ホストで GUI で確認プロンプトが出て死ぬ
OP_CONNECT_TOKENがおそらく短命ではなく,手軽な取得手段がない
もしかしたら Connect Server の前段に JWT Auth を有効にした Envoy とかを置いてしまって,実質的な認証はこっちでやってしまえばいいのかもしれない 使えないなら……
Device flow ライクな認証によって接続できる
tailscaled の持つ SSH 実装が使われるため,たまに通信が壊れることがある バイナリとかを流すと壊れがち
認証 + HTTP Proxy tunneling
なんかあんまり好きになれなかったんだよな
3. Short lived certificate でがんばる
真面目にやろうとすると Audit Log とかが必要になって……